/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hojadetrabajo5dos;
import java.util.List;
import java.util.ArrayList;
/**
 *
 * @param <E> 
 * @author RAUL
 */
public class ListaCircular<E> extends AbstractCola<E> {
    /**
     * este crea una lista de nodos llamada cola 
     */
    protected Node<E> cola; 
    boolean resultado; 
     private int top;
     /**
      * es un contador 
      */
     protected int count;
    /**
     * se crea una nueva arraylist
     */
    public List<E> lista = new ArrayList<E>();
    private Exception j;
    /**
     * 
     */
    public ListaCircular()
    // pre: constructs a new circular list
    {
    cola = null;
    count = 0;
    }

    /**
     * este metodo agrega al principio de la cola 
     * @param value es el valor que se va a gregar a la cabeza de la lista 
     */
    public void addFirst(E value)
// pre: value non-null
// post: adds element to head of list
{
    Node<E> temp = new Node<E>(value);
        if (cola == null) { // first value added
            cola = temp;
            cola.setNext(cola);
            } else { // element exists in list
                temp.setNext(cola.next());
                cola.setNext(temp);
    }
    count++;
    }
    /**
     * este metodo agrega al fina la lista 
     * @param value es el valor que se agrega al final de la cola 
     */
    public void addLast(E value)
    // pre: value non-null
    // post: adds element to tail of list
    {
    // new entry:
    addFirst(value);
    cola = cola.next();
    }
    /**
     * este metodo quita un elemento de la cola 
     * @return regresa el valor que quito
     */
    public E remove()
    // pre: !isEmpty()
    // post: returns and removes value from tail of list
    {

    Node<E> cola1 = cola;
    while (cola1.next() != cola) {
    cola1 = cola1.next();
    }
    // cola1 now points to second-to-last value
    Node<E> temp = cola;
    if (cola1 == cola)
    {
    cola = null;
    } else {
    cola1.setNext(cola.next());
    cola = cola1;
    }
    count--;
    return temp.value();
    }

    

    /**
     * 
     * @param e inserta un valor en la lista 
     * @return regresa true si es que se pudo insertar de la contrario regresa false 
     */
    @Override
    public boolean offer(E e) {
       if(isEmpty()){
            return false;
          
       }else{ 
        boolean si = lista.add(e);
        return si; 
    
       }
    }

    /**
     * este metodo quita un valor de la lista 
     * @return regresa el valor que quito y null si la cola esta vacia 
     */
    @Override
    public E poll() {
        E list;
        if(isEmpty()) return null;
        else{
            list = lista.get(0);
            lista.remove(0);
            return list;
        }
    }
    /**
     * este metodo  obtiene un valor en una posicion especifica de la cola 
     * @return
     */
    @Override
    public E peek() {
        E objeto;
        objeto = lista.get(0);
        return objeto;
    }


}
